package com.adk.backend.service;

import com.adk.backend.common.PageResult;
import com.adk.backend.entity.LxOrderList;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 订单服务接口
 */
public interface OrderService extends IService<LxOrderList> {
    
    /**
     * 分页查询订单列表
     */
    PageResult<LxOrderList> getOrderList(Map<String, Object> params);
    
    /**
     * 我的订单（客户自助查询）
     * @param params 查询参数（包含customerId, userId, shipType等）
     * @return 订单列表
     */
    PageResult<LxOrderList> getMyOrders(Map<String, Object> params);
    
    /**
     * 获取订单文件列表
     * @param orderId 订单ID
     * @return 文件列表（按类型分组）
     */
    Map<String, Object> getOrderFiles(Long orderId);
    
    /**
     * 保存订单文件
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param tkFiles 装箱单文件列表
     * @param fbaFiles FBA文件列表
     * @param asnFiles ASN文件列表
     * @param qtFiles 其他文件列表
     * @return 是否成功
     */
    boolean saveOrderFiles(Long orderId, Integer userId, MultipartFile[] tkFiles, 
                           MultipartFile[] fbaFiles, MultipartFile[] asnFiles, MultipartFile[] qtFiles);
    
    /**
     * 获取POD文件列表
     * @param orderId 订单ID
     * @return POD文件列表
     */
    Map<String, Object> getPodFiles(Long orderId);
    
    /**
     * 保存POD文件
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param podFiles POD文件列表
     * @return 是否成功
     */
    boolean savePodFiles(Long orderId, Integer userId, MultipartFile[] podFiles);
    
    /**
     * 获取ASN列表（分页）
     * @param params 查询参数
     * @return ASN列表
     */
    PageResult<Map<String, Object>> getAsnList(Map<String, Object> params);
    
    /**
     * 获取订单的ASN列表（用于添加/编辑ASN）
     * @param orderId 订单ID
     * @return ASN列表和订单信息
     */
    Map<String, Object> getOrderAsnList(Long orderId);
    
    /**
     * 保存ASN
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param asnInfo ASN信息
     * @param asnFiles ASN文件列表
     * @param sortingDetailsFile 分拣明细文件
     * @return 是否成功
     */
    boolean saveAsn(Long orderId, Integer userId, Map<String, Object> asnInfo, 
                    MultipartFile[] asnFiles, MultipartFile sortingDetailsFile);
    
    /**
     * 删除ASN
     * @param asnId ASN ID
     * @return 是否成功
     */
    boolean deleteAsn(Long asnId);
    
    /**
     * 获取订单重量信息（用于编辑重量）
     * @param orderId 订单ID
     * @return 订单重量信息和收货记录
     */
    Map<String, Object> getOrderWeightInfo(Long orderId);
    
    /**
     * 查看订单重量信息（view_weight）
     * @param orderId 订单ID
     * @return 重量信息（包含订单信息和收货日志列表）
     */
    Map<String, Object> viewOrderWeight(Long orderId);
    
    /**
     * 获取订单下载文件列表（download）
     * @param orderId 订单ID
     * @param downloadType 下载类型（0=所有文件，1=POD文件）
     * @param userGroup 用户组（用于权限控制）
     * @return 文件列表
     */
    Map<String, Object> getOrderDownloadFiles(Long orderId, Integer downloadType, Integer userGroup);
    
    /**
     * 生成打印标签（print_label）
     * @param orderId 订单ID
     * @return 标签信息（包含订单信息和条形码文件列表）
     */
    Map<String, Object> generatePrintLabel(Long orderId);
    
    /**
     * 标记订单已打印标签（print_label_without_confirm）
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean markOrderLabelPrinted(Long orderId, Integer userId);
    
    /**
     * 获取批量上传追踪信息（batch_upload_tracing）
     * @param ids 发货单ID列表（逗号分隔）
     * @param type 类型：1-更新航班信息，2-更新通过关口日期，3-更新到达目的港日期，4-更新清关状态
     * @return 追踪信息（包含订单信息、供应商列表、验证错误等）
     */
    Map<String, Object> getBatchUploadTracingInfo(String ids, Integer type);
    
    /**
     * 保存批量上传追踪信息（batch_upload_tracing_save）
     * @param params 参数Map（包含ids, type, 以及根据type不同的其他参数）
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean saveBatchUploadTracing(Map<String, Object> params, Integer userId);
    
    /**
     * 预览计费重量
     * @param orderId 订单ID
     * @param weightType 重量类型：1-除5000单箱取大值后累加，2-除6000单箱取大值后累加，3-除5000累加后取大值，4-除6000累加后取大值
     * @return 预览结果（HTML表格和总重量）
     */
    Map<String, Object> previewShipWeight(Long orderId, Integer weightType);
    
    /**
     * 保存重量编辑
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param shipWeight 计费重量
     * @param shipWeightType 重量类型
     * @return 是否成功
     */
    boolean saveWeightEdit(Long orderId, Integer userId, BigDecimal shipWeight, Integer shipWeightType);
    
    /**
     * 确认重量
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean confirmWeight(Long orderId, Integer userId);
    
    /**
     * 获取订单备注信息
     * @param id 订单ID或发货单ID
     * @param type 类型：0-订单，1-发货单
     * @return 备注信息
     */
    Map<String, Object> getOrderRemarks(Long id, Integer type);
    
    /**
     * 保存订单备注
     * @param id 订单ID或发货单ID
     * @param type 类型：0-订单，1-发货单
     * @param userId 用户ID
     * @param remarks 备注内容
     * @return 是否成功
     */
    boolean saveOrderRemarks(Long id, Integer type, Integer userId, String remarks);
    
    /**
     * 获取订单费用信息
     * @param orderId 订单ID
     * @return 订单信息和价格列表
     */
    Map<String, Object> getOrderFeeInfo(Long orderId);
    
    /**
     * 获取费用项（用于添加费用）
     * @param orderId 订单ID
     * @param feeType 费用类型ID
     * @param currencyId 货币ID
     * @return 费用项HTML和状态
     */
    Map<String, Object> getFeeItem(Long orderId, Integer feeType, Integer currencyId);
    
    /**
     * 保存订单费用
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param prices 价格数组
     * @param currencyIds 货币ID数组
     * @param feeTypes 费用类型数组
     * @param feeIds 费用ID数组（用于更新）
     * @return 是否成功
     */
    boolean saveOrderFee(Long orderId, Integer userId, BigDecimal[] prices, Integer[] currencyIds, 
                         Integer[] feeTypes, Long[] feeIds);
    
    /**
     * 删除订单价格
     * @param priceId 价格ID
     * @return 是否成功
     */
    boolean deleteOrderPrice(Long priceId);
    
    /**
     * 获取沙特海运发货订单列表（seaf）
     * @param params 查询参数
     * @return 订单列表
     */
    PageResult<Map<String, Object>> getSeafOrderList(Map<String, Object> params);
    
    /**
     * 获取沙特空运发货订单列表（airf）
     * @param params 查询参数
     * @return 订单列表
     */
    PageResult<Map<String, Object>> getAirfOrderList(Map<String, Object> params);
    
    /**
     * 获取沙特空运到达订单列表（aire）
     * @param params 查询参数
     * @return 订单列表
     */
    PageResult<Map<String, Object>> getAireOrderList(Map<String, Object> params);
    
    /**
     * 获取沙特海运到达订单列表（seae）
     * @param params 查询参数
     * @return 订单列表
     */
    PageResult<Map<String, Object>> getSeaeOrderList(Map<String, Object> params);
    
    /**
     * 根据订单号查询订单详情
     */
    LxOrderList getOrderByNo(String orderNo);
    
    /**
     * 创建订单
     * @param order 订单信息
     * @param userId 用户ID
     * @param userGroup 用户组（可选，如果为13则需要从session获取customer_id）
     * @param sessionCustomerId 会话中的客户ID（当userGroup=13时使用）
     * @param whAdd 仓库地址信息（可选）
     * @return 创建的订单
     */
    LxOrderList createOrder(LxOrderList order, Integer userId, Integer userGroup, Long sessionCustomerId, Map<String, Object> whAdd);
    
    /**
     * 更新订单
     */
    boolean updateOrder(LxOrderList order, Integer userId);
    
    /**
     * 删除订单
     */
    boolean deleteOrder(Long id, Integer userId);
    
    /**
     * 批量删除订单
     */
    boolean batchDeleteOrders(java.util.List<Long> ids);
    
    /**
     * 批量更新订单状态
     */
    boolean batchUpdateStatus(java.util.List<Long> ids, Integer status);
    
    /**
     * 批量更新预约状态
     */
    boolean batchUpdateBooking(java.util.List<Long> ids, String bookingNo, Integer bookingType);
    
    /**
     * 批量装柜
     */
    boolean batchUpdateLoading(java.util.List<Long> ids, java.util.Map<String, Object> params);
    
    /**
     * 批量装柜（按ship_log ID）
     * @param slIds ship_log ID列表
     * @param params 装柜参数（loadingDate, loadingNo, blNo, shipNameNo, shipFee, remarks）
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean batchUpdateLoadingBySlId(java.util.List<Long> slIds, java.util.Map<String, Object> params, Integer userId);
    
    /**
     * 批量更新头程单号
     */
    boolean batchUpdateTxNo(java.util.List<Long> ids, String txNo);
    
    /**
     * 批量更新航班信息
     */
    boolean batchUpdateFlight(java.util.List<Long> ids, String flightNo, String flightDate);
    
    /**
     * 批量到达
     */
    boolean batchUpdateArrival(java.util.List<Long> ids, String arrivalDate);
    
    /**
     * 批量到达（按ship_log ID）
     * @param slIds ship_log ID列表
     * @param arrivalDate 到达日期
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean batchUpdateArrivalBySlId(java.util.List<Long> slIds, String arrivalDate, Integer userId);
    
    /**
     * 批量清关
     */
    boolean batchUpdateClearance(java.util.List<Long> ids, String clearanceDate);
    
    /**
     * 批量设置品牌备注
     */
    boolean batchUpdateBrandRemarks(java.util.List<Long> ids, String isBrandRemarks, Integer isSensitive);
    
    /**
     * 批量修改交货方式
     */
    boolean batchUpdateOrderType(java.util.List<Long> ids, Integer orderType);
    
    /**
     * 批量签收
     */
    boolean batchUpdateRecvd(java.util.List<Long> ids, String recvdDate);
    
    /**
     * 批量盘点完成
     */
    boolean batchUpdatePd(java.util.List<Long> ids, String pdDate);
    
    /**
     * 批量到达海外仓
     */
    boolean batchUpdateArrivalOverseas(java.util.List<Long> ids, String arrivalDate);
    
    /**
     * 批量更新单价
     */
    boolean batchUpdatePrice(java.util.List<Long> ids, java.math.BigDecimal price);
    
    /**
     * 订单审核
     */
    boolean checkOrder(Long id, java.util.Map<String, Object> params, Long userId);
    
    /**
     * 获取待审核订单列表
     */
    java.util.List<LxOrderList> getPendingCheckOrders(Map<String, Object> params);
    
    /**
     * 获取订单审核信息（用于审核页面）
     * @param orderId 订单ID
     * @return 订单审核信息
     */
    Map<String, Object> getOrderCheckInfo(Long orderId);
    
    /**
     * 更新订单业务员
     * @param orderId 订单ID
     * @param salesUid 业务员ID
     * @param userId 操作用户ID
     * @return 是否成功
     */
    boolean updateOrderSalesUid(Long orderId, Long salesUid, Integer userId);
    
    /**
     * 停止发货
     * @param orderId 订单ID
     * @param stopShipRemarks 停止发货备注
     * @param userId 操作用户ID
     * @return 是否成功
     */
    boolean stopShip(Long orderId, String stopShipRemarks, Integer userId);
    
    /**
     * 恢复发货
     * @param orderId 订单ID
     * @param userId 操作用户ID
     * @return 是否成功
     */
    boolean resumeShip(Long orderId, Integer userId);
    
    /**
     * 获取停止发货信息
     * @param orderId 订单ID
     * @return 停止发货信息
     */
    Map<String, Object> getStopShipInfo(Long orderId);
    
    /**
     * 搜索订单（根据订单号和ASN号）
     * @param orderNo 订单号
     * @param asnNo ASN号
     * @param customerId 客户ID（如果是客户登录，需要限制查询范围）
     * @return 搜索结果列表
     */
    List<Map<String, Object>> searchOrderByOrderNoAndAsnNo(String orderNo, String asnNo, Long customerId);
    
    /**
     * 获取异常订单列表
     * @param params 查询参数
     * @return 异常订单列表
     */
    PageResult<Map<String, Object>> getUnusualOrderList(Map<String, Object> params);
    
    /**
     * 强制删除订单
     */
    boolean forceDeleteOrder(Long id);
    
    /**
     * 批量国内查验
     */
    boolean batchCnCheck(java.util.List<Long> ids, String checkDate, String remarks, Integer shipType, Integer userId);
    
    /**
     * 批量国内查验（按ship_log ID）
     * @param slIds ship_log ID列表
     * @param checkDate 查验日期
     * @param remarks 备注
     * @param shipType 运输方式
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean batchCnCheckBySlId(java.util.List<Long> slIds, String checkDate, String remarks, Integer shipType, Integer userId);
    
    /**
     * 批量更新航班信息（完整版 - 包含提单号、件数、重量等）
     */
    boolean batchUpdateFlightInfo(java.util.List<Long> orderIds, java.util.Map<String, Object> params, Integer userId);
    
    /**
     * 批量修改二程预配
     */
    boolean batchUpdateSecondFlight(java.util.List<Long> orderIds, String flightDate2, String flightDateTime2, String remarks, Integer userId);
    
    /**
     * 批量联程头程起飞
     */
    boolean batchFirstFlightTakeoff(java.util.List<Long> orderIds, String flightDate, String flightDateTime, String remarks, Integer userId);
    
    /**
     * 根据提单号修改提单号
     */
    boolean resetBlNoByBlNo(String oldBlNo, String newBlNo, Integer userId);
    
    /**
     * 根据头程单号修改提单号
     */
    boolean resetBlNoByTxNo(String txNo, String oldBlNo, String newBlNo, Integer userId);
    
    /**
     * 根据订单号修改提单号
     */
    boolean resetBlNoByOrderNo(String orderNo, String oldBlNo, String newBlNo, Integer userId);
    
    /**
     * 更新提单总金额（根据订单ID）
     */
    void updateBlTotalAmount(Long orderId);
    
    /**
     * 生成授权码
     */
    java.util.Map<String, Object> generateAuthCode(Integer userId);
    
    /**
     * 检查授权码是否有效
     */
    boolean checkAuthCode(Integer authCode, Integer type);
    
    /**
     * 使用授权码（标记为已使用）
     */
    boolean useAuthCode(Integer userId, Integer authCode, Integer type);
    
    /**
     * 重置头程日期（根据头程单号）
     */
    boolean resetTxDate(String txNo, String txDate, String txDateTime, Integer userId);
    
    /**
     * 根据提单号重置头程日期
     */
    boolean resetTxDateByBlNo(String blNo, String txDate, String txDateTime, Integer userId);
    
    /**
     * 根据提单号重置航班起飞日期
     */
    boolean resetFlightDateByBlNo(String blNo, String flightDate, String flightDateTime, Integer userId);
    
    /**
     * 清除头程单号（根据订单号）
     */
    boolean removeTxNo(String orderNo, Integer userId);
    
    /**
     * 重置发货数（根据订单号）
     */
    boolean resetShippedQty(String orderNo, Integer shippedQty, Integer userId);
    
    /**
     * 根据订单号重置出库日期
     */
    boolean resetObTime(String orderNo, String statusDate, String statusDateTime, Integer userId);
    
    /**
     * 根据订单号强行重置计费重
     */
    boolean resetShipWeight(String orderNo, java.math.BigDecimal shipWeight, Integer userId);
    
    /**
     * 根据订单号重设业务
     */
    boolean resetYwByOrderNo(String orderNo, Long salesUid, Integer userId);
    
    /**
     * 根据订单号强行重置同行计费重
     */
    boolean resetTxShipWeight(String orderNo, java.math.BigDecimal txShipWeight, Integer userId);
    
    /**
     * 根据订单号更改订单所属客户
     */
    boolean resetCustomerIdByOrderNo(String orderNo, Long newCustomerId, Integer userId);
    
    /**
     * 根据订单号强行重置实际体积
     */
    boolean resetTrueVwByOrderNo(String orderNo, java.math.BigDecimal trueVw, Integer userId);
    
    /**
     * 根据提单号修改提单重量
     */
    boolean resetGwByBlNo(String blNo, java.math.BigDecimal gw, Integer userId);
    
    /**
     * 根据头程单号修改头程单号
     */
    boolean resetTxNoByTxNo(String txNo, String newTxNo, Integer userId);
    
    /**
     * 根据订单号修改运输方式
     */
    boolean resetOrderShipType(String orderNo, Integer shipType, Integer userId);
    
    /**
     * 根据订单号修改订单号
     */
    boolean resetOrderNoByOrderNo(String orderNo, String newOrderNo, Integer userId);
    
    /**
     * 根据提单号修改Manifest申报金额
     */
    boolean resetManifestFeeByBlNo(String blNo, java.math.BigDecimal mainfestFee, Integer userId);
    
    /**
     * 根据柜号强行修改海运费
     */
    boolean resetShipFeeByLoadingNo(String loadingNo, java.math.BigDecimal shipFee, Integer userId);
    
    /**
     * 重置为待入库
     */
    boolean resetPendingIb(String orderNo, Integer userId);
    
    /**
     * 上传装箱单Excel并解析
     * 对应PHP: orders.php case 'upload_pl_save'
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param plFile 装箱单Excel文件
     * @return 是否成功
     */
    boolean uploadPackingList(Long orderId, Integer userId, MultipartFile plFile);
    
    /**
     * 查看装箱单
     * 对应PHP: orders.php case 'view_pl'
     * @param orderId 订单ID
     * @return 装箱单信息（包含订单信息和装箱单明细列表）
     */
    Map<String, Object> getPackingList(Long orderId);
    
    /**
     * 删除附件
     * 对应PHP: orders.php case 'del_attr'
     * @param attrId 附件ID
     * @param orderId 订单ID（用于验证）
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteAttr(Long attrId, Long orderId, Integer userId);
    
    /**
     * 获取预约号码信息
     * 对应PHP: orders.php case 'booking_no'
     * @param orderId 订单ID
     * @return 预约号码信息
     */
    Map<String, Object> getBookingNo(Long orderId);
    
    /**
     * 保存预约号码
     * 对应PHP: orders.php case 'booking_no_save'
     * @param orderId 订单ID
     * @param bookingNo 预约号码
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean saveBookingNo(Long orderId, Long bookingNo, Integer userId);
    
    /**
     * 获取预约日期信息
     * 对应PHP: orders.php case 'booking_date'
     * @param orderId 订单ID
     * @return 预约日期信息
     */
    Map<String, Object> getBookingDate(Long orderId);
    
    /**
     * 保存预约日期
     * 对应PHP: orders.php case 'booking_date_save'
     * @param orderId 订单ID
     * @param bookingDate 预约日期（YYYY-MM-DD）
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean saveBookingDate(Long orderId, String bookingDate, Integer userId);
    
    /**
     * 保存头程单号
     * 对应PHP: orders.php case 'save_tx_no'
     * @param shipLogIds 发货单ID列表（逗号分隔）
     * @param txNo 头程单号
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean saveTxNo(String shipLogIds, String txNo, Integer userId);
    
    /**
     * 更新订单信息（编辑箱号等）
     * 对应PHP: orders.php case 'edit_ctn_save'
     * @param orderId 订单ID
     * @param params 更新参数Map
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean updateOrderInfo(Long orderId, Map<String, Object> params, Integer userId);
    
    /**
     * 更新订单品牌信息
     * 对应PHP: orders.php case 'save_brand'
     * @param orderId 订单ID
     * @param params 更新参数Map（包含is_brand, is_brand_remarks, is_sensitive等）
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean updateOrderBrand(Long orderId, Map<String, Object> params, Integer userId);
    
    /**
     * 获取签收日期信息
     * 对应PHP: orders.php case 'recv_date'
     * @param orderId 订单ID
     * @return 签收日期信息（包含订单信息和签收信息、POD文件列表）
     */
    Map<String, Object> getRecvDate(Long orderId);
    
    /**
     * 保存签收日期
     * 对应PHP: orders.php case 'recv_date_save'
     * @param orderId 订单ID
     * @param recvDate 签收日期（YYYY-MM-DD）
     * @param recvType 签收类型：1-已签收，2-交付上架部门，3-交付DS部门，4-交付第三方物流，5-派送异常，6-交付B2C部门，7-已签收，8-部分签收
     * @param recvNo 第三方物流单号
     * @param recvCtns 签收箱数（当recvType=8时使用）
     * @param remarks 备注
     * @param podFiles POD文件数组
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean saveRecvDate(Long orderId, String recvDate, Integer recvType, String recvNo, 
                         Integer recvCtns, String remarks, MultipartFile[] podFiles, Integer userId);
    
    /**
     * 获取批量航班预约信息
     * 对应PHP: orders.php case 'booking_flight'
     * @param ids 发货单ID列表（逗号分隔）或订单ID列表
     * @param type 类型：1-单个订单，2-批量（按发货单ID），3-批量（按订单ID），4-批量（按订单ID）
     * @return 航班预约信息（包含订单列表、错误信息等）
     */
    Map<String, Object> getBatchBookingFlightInfo(String ids, Integer type);
    
    /**
     * 保存航班预约（单个或批量）
     * 对应PHP: orders.php case 'booking_flight_save'
     * @param orderId 订单ID（单个时使用）
     * @param ids 订单ID列表（批量时使用，逗号分隔）
     * @param slIds 发货单ID列表（批量时使用，逗号分隔）
     * @param flightDate 航班日期（YYYY-MM-DD）
     * @param flightDateTime 航班时间（HH:mm）
     * @param flightDate2 航班日期2（YYYY-MM-DD，联程时使用）
     * @param flightDateTime2 航班时间2（HH:mm）
     * @param flightType 航班类型：1-直飞，2-联程
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean saveBookingFlight(Long orderId, String ids, String slIds, String flightDate, 
                              String flightDateTime, String flightDate2, String flightDateTime2, 
                              Integer flightType, Integer userId);
    
    /**
     * 编辑航班预约（单个或批量）
     * 对应PHP: orders.php case 'edit_booking_flight_save'
     * @param orderId 订单ID（单个时使用）
     * @param ids 订单ID列表（批量时使用，逗号分隔）
     * @param slIds 发货单ID列表（批量时使用，逗号分隔）
     * @param flightDate 航班日期（YYYY-MM-DD）
     * @param flightDate2 航班日期2（YYYY-MM-DD，联程时使用）
     * @param flightType 航班类型：1-直飞，2-联程
     * @param remarks 备注
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean editBookingFlight(Long orderId, String ids, String slIds, String flightDate, 
                              String flightDate2, Integer flightType, String remarks, Integer userId);
    
    /**
     * 获取单个订单的航班预约信息
     * 对应PHP: orders.php case 'booking_flight' (type=1)
     * @param orderId 订单ID
     * @return 航班预约信息
     */
    Map<String, Object> getBookingFlightInfo(Long orderId);
    
    /**
     * 重置为待确认计费重
     */
    boolean resetConfirmWeight(String orderNo, Integer userId);
    
    /**
     * 重置为已确认计费重
     */
    boolean resetConfirmedWeight(String orderNo, Integer userId);
    
    /**
     * 打开订单拆单权限
     */
    boolean resetCreateXx(String orderNo, Integer userId);
    
    /**
     * 根据提单号回退订单状态
     */
    boolean resetOrderStatusByBlNo(String blNo, Integer customerStatus, Integer userId);
    
    /**
     * 根据订单号回退订单状态
     */
    boolean resetOrderStatusByOrderNo(String orderNo, Integer customerStatus, Integer userId);
    
    /**
     * 根据头程单号回退订单状态
     */
    boolean resetOrderStatusByTxNo(String txNo, Integer customerStatus, Integer userId);
    
    /**
     * 根据柜号回退订单状态
     */
    boolean resetOrderStatusByLoadingNo(String loadingNo, Integer customerStatus, Integer userId);
    
    /**
     * 超级删除订单
     */
    boolean supperDel(String orderNo, Integer authCode, Integer userId);
    
    /**
     * 超级删除子订单
     */
    boolean supperDelSubOrder(String orderNo, Integer userId);
    
    /**
     * 上传仓库收货数据
     */
    boolean updateRecvLogs(String orderNo, MultipartFile excelFile, Integer userId);
    
    /**
     * 按月批量下载订单数据
     */
    java.util.List<java.util.Map<String, Object>> supperDownload(String startMonth, Integer downloadFrom, Long customerId);
}

